package com.open.center.common.databind;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.BeanUtils;

import com.open.center.common.constant.Enumerator;

/**
 * 枚举反序列化
 * <p>
 * 适用于{ @RequestBody }
 */
@Slf4j
public class JsonEnumDeserializer extends JsonDeserializer<Enumerator<?, ?>> {

    @Override
    public Enumerator<?, ?> deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        JsonNode node = parser.getCodec().readTree(parser);
        String currentName = parser.currentName();
        Object currentValue = parser.currentValue();
        Class<?> propertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass());
        Enumerator<?, ?> enumerator = null;
        if (node.isObject()) {
            String id = node.get("id").asText();
            for (Object objectEnum : propertyType.getEnumConstants()) {
                enumerator = (Enumerator<?, ?>) objectEnum;
                if (enumerator.getId() instanceof Integer
                        && enumerator.getId().equals(Integer.valueOf(id))) {
                    return enumerator;
                }
                if (enumerator.getId().equals(id)) {
                    return enumerator;
                }
            }
        } else if (node.isTextual()) {
            String id = node.asText();
            for (Object objectEnum : propertyType.getEnumConstants()) {
                enumerator = (Enumerator<?, ?>) objectEnum;
                if (enumerator.getId().equals(id)) {
                    return enumerator;
                }
            }
        } else if (node.isInt()) {
            Integer id = node.asInt();
            for (Object objectEnum : propertyType.getEnumConstants()) {
                enumerator = (Enumerator<?, ?>) objectEnum;
                if (enumerator.getId().equals(id)) {
                    return enumerator;
                }
            }
        }
        return enumerator;
    }
}
